home *** CD-ROM | disk | FTP | other *** search
/ MacFormat UK 186 / MF_UK_186_1.iso / pc / DiscContents / In the mag / Widgets / FlopCruncher 1.3 / FlopCruncher / FlopCruncher.wdgt / boxover.js next >
Encoding:
Text File  |  2007-07-16  |  11.6 KB  |  397 lines

  1. /* --- BoxOver ---
  2. /* --- v 2.1 17th June 2006
  3. By Oliver Bryant with help of Matthew Tagg
  4. http://boxover.swazz.org */
  5.  
  6. if (typeof document.attachEvent!='undefined') {
  7.    window.attachEvent('onload',init);
  8.    document.attachEvent('onmousemove',moveMouse);
  9.    document.attachEvent('onclick',checkMove); }
  10. else {
  11.    window.addEventListener('load',init,false);
  12.    document.addEventListener('mousemove',moveMouse,false);
  13.    document.addEventListener('click',checkMove,false);
  14. }
  15.  
  16. var oDv=document.createElement("div");
  17. var dvHdr=document.createElement("div");
  18. var dvBdy=document.createElement("div");
  19. var ttOn = true;
  20. var windowlock,boxMove,fixposx,fixposy,lockX,lockY,fixx,fixy,ox,oy,boxLeft,boxRight,boxTop,boxBottom,evt,mouseX,mouseY,totalScrollTop,totalScrollLeft;
  21. ox=10;
  22. oy=-8;
  23. lockX=0;
  24. lockY=0;
  25. hdrTextColor = '#22dd22';
  26. hdrBackColor = '#003300';
  27. bdyTextColor = '#22dd22';
  28. bdyBackColor = '#003300';
  29.  
  30. function init() {
  31.     oDv.appendChild(dvHdr);
  32.     oDv.appendChild(dvBdy);
  33.     oDv.style.position="absolute";
  34.     oDv.style.zIndex=30;
  35.     oDv.style.visibility='hidden';
  36.     document.body.appendChild(oDv);    
  37. }
  38.  
  39. function defHdrStyle() {
  40.     dvHdr.innerHTML='<img  style="vertical-align:middle" src="">  '+dvHdr.innerHTML;
  41.     dvHdr.style.fontWeight='bold';
  42.     dvHdr.style.width='150px';
  43.     dvHdr.style.fontFamily='arial';
  44.     dvHdr.style.borderLeft='1px solid #ffffff';
  45.     dvHdr.style.borderRight='1px solid #ffffff';
  46.     dvHdr.style.borderTop='1px solid #ffffff';
  47.     dvHdr.style.padding='3';
  48.     dvHdr.style.fontSize='11';
  49.     dvHdr.style.color=hdrTextColor;
  50.     dvHdr.style.background=hdrBackColor;
  51.     if (ttOn)
  52.         dvHdr.style.opacity='0.90';
  53.     else
  54.         dvHdr.style.opacity='0.0';
  55. }
  56.  
  57. function themeToolTips(dark, light)
  58. {
  59.     hdrTextColor = light;
  60.     hdrBackColor = dark;
  61.     bdyTextColor = dark;
  62.     bdyBackColor = light;
  63. }
  64.  
  65. function defBdyStyle() {
  66.     dvBdy.style.borderBottom='1px solid #ffffff';
  67.     dvBdy.style.borderLeft='1px solid #ffffff';
  68.     dvBdy.style.borderRight='1px solid #ffffff';
  69.     dvBdy.style.borderBottom='1px solid #ffffff';
  70.     dvBdy.style.width='150px';
  71.     dvBdy.style.fontFamily='arial';
  72.     dvBdy.style.fontSize='11';
  73.     dvBdy.style.padding='3';
  74.     dvBdy.style.color=bdyTextColor;
  75.     dvBdy.style.background=bdyBackColor;
  76.     if (ttOn)
  77.         dvBdy.style.opacity='0.90';
  78.     else
  79.         dvBdy.style.opacity='0.0';
  80. }
  81.  
  82. function checkElemBO(txt) {
  83. if (!txt || typeof(txt) != 'string') return false;
  84. if ((txt.indexOf('header')>-1)&&(txt.indexOf('body')>-1)&&(txt.indexOf('[')>-1)&&(txt.indexOf('[')>-1)) 
  85.    return true;
  86. else
  87.    return false;
  88. }
  89.  
  90. function scanBO(curNode) {
  91.       if (checkElemBO(curNode.title)) {
  92.          curNode.boHDR=getParam('header',curNode.title);
  93.          curNode.boBDY=getParam('body',curNode.title);
  94.             curNode.boCSSBDY=getParam('cssbody',curNode.title);            
  95.             curNode.boCSSHDR=getParam('cssheader',curNode.title);
  96.             curNode.IEbugfix=(getParam('hideselects',curNode.title)=='on')?true:false;
  97.             curNode.fixX=parseInt(getParam('fixedrelx',curNode.title));
  98.             curNode.fixY=parseInt(getParam('fixedrely',curNode.title));
  99.             curNode.absX=parseInt(getParam('fixedabsx',curNode.title));
  100.             curNode.absY=parseInt(getParam('fixedabsy',curNode.title));
  101.             curNode.offY=(getParam('offsety',curNode.title)!='')?parseInt(getParam('offsety',curNode.title)):-8;
  102.             curNode.offX=(getParam('offsetx',curNode.title)!='')?parseInt(getParam('offsetx',curNode.title)):10;
  103.             curNode.fade=(getParam('fade',curNode.title)=='on')?true:false;
  104.             curNode.fadespeed=(getParam('fadespeed',curNode.title)!='')?getParam('fadespeed',curNode.title):0.04;
  105.             curNode.delay=(getParam('delay',curNode.title)!='')?parseInt(getParam('delay',curNode.title)):0;
  106.             if (getParam('requireclick',curNode.title)=='on') {
  107.                 curNode.requireclick=true;
  108.                 document.all?curNode.attachEvent('onclick',showHideBox):curNode.addEventListener('click',showHideBox,false);
  109.                 document.all?curNode.attachEvent('onmouseover',hideBox):curNode.addEventListener('mouseover',hideBox,false);
  110.             }
  111.             else {// Note : if requireclick is on the stop clicks are ignored               
  112.                if (getParam('doubleclickstop',curNode.title)!='off') {
  113.                    document.all?curNode.attachEvent('ondblclick',pauseBox):curNode.addEventListener('dblclick',pauseBox,false);
  114.                }    
  115.                if (getParam('singleclickstop',curNode.title)=='on') {
  116.                    document.all?curNode.attachEvent('onclick',pauseBox):curNode.addEventListener('click',pauseBox,false);
  117.                }
  118.            }
  119.             curNode.windowLock=getParam('windowlock',curNode.title).toLowerCase()=='off'?false:true;
  120.             curNode.title='';
  121.             curNode.hasbox=1;
  122.        }
  123.        else
  124.           curNode.hasbox=2;   
  125. }
  126.  
  127.  
  128. function getParam(param,list) {
  129.     var reg = new RegExp('([^a-zA-Z]' + param + '|^' + param + ')\\s*=\\s*\\[\\s*(((\\[\\[)|(\\]\\])|([^\\]\\[]))*)\\s*\\]');
  130.     var res = reg.exec(list);
  131.     var returnvar;
  132.     if(res)
  133.         return res[2].replace('[[','[').replace(']]',']');
  134.     else
  135.         return '';
  136. }
  137.  
  138. function Left(elem){    
  139.     var x=0;
  140.     if (elem.calcLeft)
  141.         return elem.calcLeft;
  142.     var oElem=elem;
  143.     while(elem){
  144.          if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderLeftWidth)))&&(x!=0))
  145.              x+=parseInt(elem.currentStyle.borderLeftWidth);
  146.          x+=elem.offsetLeft;
  147.          elem=elem.offsetParent;
  148.       } 
  149.     oElem.calcLeft=x;
  150.     return x;
  151.     }
  152.  
  153. function Top(elem){
  154.      var x=0;
  155.      if (elem.calcTop)
  156.          return elem.calcTop;
  157.      var oElem=elem;
  158.      while(elem){        
  159.           if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderTopWidth)))&&(x!=0))
  160.              x+=parseInt(elem.currentStyle.borderTopWidth); 
  161.          x+=elem.offsetTop;
  162.              elem=elem.offsetParent;
  163.       } 
  164.       oElem.calcTop=x;
  165.       return x;
  166.       
  167. }
  168.  
  169. var ah,ab;
  170. function applyStyles() {
  171.     if(ab)
  172.         oDv.removeChild(dvBdy);
  173.     if (ah)
  174.         oDv.removeChild(dvHdr);
  175.     dvHdr=document.createElement("div");
  176.     dvBdy=document.createElement("div");
  177.     CBE.boCSSBDY?dvBdy.className=CBE.boCSSBDY:defBdyStyle();
  178.     CBE.boCSSHDR?dvHdr.className=CBE.boCSSHDR:defHdrStyle();
  179.     dvHdr.innerHTML=CBE.boHDR;
  180.     dvBdy.innerHTML=CBE.boBDY;
  181.     ah=false;
  182.     ab=false;
  183.     if (CBE.boHDR!='') {        
  184.         oDv.appendChild(dvHdr);
  185.         ah=true;
  186.     }    
  187.     if (CBE.boBDY!=''){
  188.         oDv.appendChild(dvBdy);
  189.         ab=true;
  190.     }    
  191. }
  192.  
  193. var CSE,iterElem,LSE,CBE,LBE, totalScrollLeft, totalScrollTop, width, height ;
  194. var ini=false;
  195.  
  196. // Customised function for inner window dimension
  197. function SHW() {
  198.    if (document.body && (document.body.clientWidth !=0)) {
  199.       width=document.body.clientWidth;
  200.       height=document.body.clientHeight;
  201.    }
  202.    if (document.documentElement && (document.documentElement.clientWidth!=0) && (document.body.clientWidth + 20 >= document.documentElement.clientWidth)) {
  203.       width=document.documentElement.clientWidth;   
  204.       height=document.documentElement.clientHeight;   
  205.    }   
  206.    return [width,height];
  207. }
  208.  
  209.  
  210. var ID=null;
  211. function moveMouse(e) {
  212.    //boxMove=true;
  213.     e?evt=e:evt=event;
  214.     
  215.     CSE=evt.target?evt.target:evt.srcElement;
  216.     
  217.     if (!CSE.hasbox) {
  218.        // Note we need to scan up DOM here, some elements like TR don't get triggered as srcElement
  219.        iElem=CSE;
  220.        while ((iElem.parentNode) && (!iElem.hasbox)) {
  221.           scanBO(iElem);
  222.           iElem=iElem.parentNode;
  223.        }       
  224.     }
  225.     
  226.     if ((CSE!=LSE)&&(!isChild(CSE,dvHdr))&&(!isChild(CSE,dvBdy))){        
  227.        if (!CSE.boxItem) {
  228.             iterElem=CSE;
  229.             while ((iterElem.hasbox==2)&&(iterElem.parentNode))
  230.                     iterElem=iterElem.parentNode; 
  231.             CSE.boxItem=iterElem;
  232.             }
  233.         iterElem=CSE.boxItem;
  234.         if (CSE.boxItem&&(CSE.boxItem.hasbox==1))  {
  235.             LBE=CBE;
  236.             CBE=iterElem;
  237.             if (CBE!=LBE) {
  238.                 applyStyles();
  239.                 if (!CBE.requireclick)
  240.                     if (CBE.fade) {
  241.                         if (ID!=null)
  242.                             clearTimeout(ID);
  243.                         ID=setTimeout("fadeIn("+CBE.fadespeed+")",CBE.delay);
  244.                     }
  245.                     else {
  246.                         if (ID!=null)
  247.                             clearTimeout(ID);
  248.                         COL=1;
  249.                         ID=setTimeout("oDv.style.visibility='visible';ID=null;",CBE.delay);                        
  250.                     }
  251.                 if (CBE.IEbugfix) {hideSelects();} 
  252.                 fixposx=!isNaN(CBE.fixX)?Left(CBE)+CBE.fixX:CBE.absX;
  253.                 fixposy=!isNaN(CBE.fixY)?Top(CBE)+CBE.fixY:CBE.absY;            
  254.                 lockX=0;
  255.                 lockY=0;
  256.                 boxMove=true;
  257.                 ox=CBE.offX?CBE.offX:10;
  258.                 oy=CBE.offY?CBE.offY:-8;
  259.             }
  260.         }
  261.         else if (!isChild(CSE,dvHdr) && !isChild(CSE,dvBdy) && (boxMove))    {
  262.             // The conditional here fixes flickering between tables cells.
  263.             if ((!isChild(CBE,CSE)) || (CSE.tagName!='TABLE')) {               
  264.                CBE=null;
  265.                if (ID!=null)
  266.                       clearTimeout(ID);
  267.                fadeOut();
  268.                showSelects();
  269.             }
  270.         }
  271.         LSE=CSE;
  272.     }
  273.     else if (((isChild(CSE,dvHdr) || isChild(CSE,dvBdy))&&(boxMove))) {
  274.         totalScrollLeft=0;
  275.         totalScrollTop=0;
  276.         
  277.         iterElem=CSE;
  278.         while(iterElem) {
  279.             if(!isNaN(parseInt(iterElem.scrollTop)))
  280.                 totalScrollTop+=parseInt(iterElem.scrollTop);
  281.             if(!isNaN(parseInt(iterElem.scrollLeft)))
  282.                 totalScrollLeft+=parseInt(iterElem.scrollLeft);
  283.             iterElem=iterElem.parentNode;            
  284.         }
  285.         if (CBE!=null) {
  286.             boxLeft=Left(CBE)-totalScrollLeft;
  287.             boxRight=parseInt(Left(CBE)+CBE.offsetWidth)-totalScrollLeft;
  288.             boxTop=Top(CBE)-totalScrollTop;
  289.             boxBottom=parseInt(Top(CBE)+CBE.offsetHeight)-totalScrollTop;
  290.             doCheck();
  291.         }
  292.     }
  293.     
  294.     if (boxMove&&CBE) {
  295.         // This added to alleviate bug in IE6 w.r.t DOCTYPE
  296.         bodyScrollTop=document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop;
  297.         bodyScrollLet=document.documentElement&&document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft;
  298.         mouseX=evt.pageX?evt.pageX-bodyScrollLet:evt.clientX-document.body.clientLeft;
  299.         mouseY=evt.pageY?evt.pageY-bodyScrollTop:evt.clientY-document.body.clientTop;
  300.         if ((CBE)&&(CBE.windowLock)) {
  301.             mouseY < -oy?lockY=-mouseY-oy:lockY=0;
  302.             mouseX < -ox?lockX=-mouseX-ox:lockX=0;
  303.             mouseY > (SHW()[1]-oDv.offsetHeight-oy)?lockY=-mouseY+SHW()[1]-oDv.offsetHeight-oy:lockY=lockY;
  304.             mouseX > (SHW()[0]-dvBdy.offsetWidth-ox)?lockX=-mouseX-ox+SHW()[0]-dvBdy.offsetWidth:lockX=lockX;            
  305.         }
  306.         oDv.style.left=((fixposx)||(fixposx==0))?fixposx:bodyScrollLet+mouseX+ox+lockX+"px";
  307.         oDv.style.top=((fixposy)||(fixposy==0))?fixposy:bodyScrollTop+mouseY+oy+lockY+"px";        
  308.         
  309.     }
  310. }
  311.  
  312. function doCheck() {    
  313.     if (   (mouseX < boxLeft)    ||     (mouseX >boxRight)     || (mouseY < boxTop) || (mouseY > boxBottom)) {
  314.         if (!CBE.requireclick)
  315.             fadeOut();
  316.         if (CBE.IEbugfix) {showSelects();}
  317.         CBE=null;
  318.     }
  319. }
  320.  
  321. function pauseBox(e) {
  322.    e?evt=e:evt=event;
  323.     boxMove=false;
  324.     evt.cancelBubble=true;
  325. }
  326.  
  327. function showHideBox(e) {
  328.     oDv.style.visibility=(oDv.style.visibility!='visible')?'visible':'hidden';
  329. }
  330.  
  331. function hideBox(e) {
  332.     oDv.style.visibility='hidden';
  333. }
  334.  
  335. var COL=0;
  336. var stopfade=false;
  337. function fadeIn(fs) {
  338.         ID=null;
  339.         COL=0;
  340.         oDv.style.visibility='visible';
  341.         fadeIn2(fs);
  342. }
  343.  
  344. function fadeIn2(fs) {
  345.         COL=COL+fs;
  346.         COL=(COL>1)?1:COL;
  347.         oDv.style.filter='alpha(opacity='+parseInt(100*COL)+')';
  348.         oDv.style.opacity=COL;
  349.         if (COL<1)
  350.          setTimeout("fadeIn2("+fs+")",20);        
  351. }
  352.  
  353.  
  354. function fadeOut() {
  355.     oDv.style.visibility='hidden';
  356.     
  357. }
  358.  
  359. function isChild(s,d) {
  360.     while(s) {
  361.         if (s==d) 
  362.             return true;
  363.         s=s.parentNode;
  364.     }
  365.     return false;
  366. }
  367.  
  368. var cSrc;
  369. function checkMove(e) {
  370.     e?evt=e:evt=event;
  371.     cSrc=evt.target?evt.target:evt.srcElement;
  372.     if ((!boxMove)&&(!isChild(cSrc,oDv))) {
  373.         fadeOut();
  374.         if (CBE&&CBE.IEbugfix) {showSelects();}
  375.         boxMove=true;
  376.         CBE=null;
  377.     }
  378. }
  379.  
  380. function showSelects(){
  381.    var elements = document.getElementsByTagName("select");
  382.    for (i=0;i< elements.length;i++){
  383.       elements[i].style.visibility='visible';
  384.    }
  385. }
  386.  
  387. function hideSelects(){
  388.    var elements = document.getElementsByTagName("select");
  389.    for (i=0;i< elements.length;i++){
  390.    elements[i].style.visibility='hidden';
  391.    }
  392. }
  393.  
  394. function tooltipsClicked()
  395. {
  396.     ttOn = ttOn ? false : true;
  397. }